import os

import yaml


class YamlJsonAttr(dict):
    """定义一个对象数据获取器"""

    def __init__(self, *args, **kwargs):
        super(YamlJsonAttr, self).__init__(*args, **kwargs)

    def __getattr__(self, item):
        """__getattr__函数的作用： 如果属性查找（attribute lookup）在实例以及对应的类中（通过__dict__)失败，
         那么会调用到类的__getattr__函数；如果没有定义这个函数，那么抛出AttributeError异常。
         由此可见，__getattr__一定是作用于属性查找的最后一步
        """
        value = None  # 默认值None
        try:
            value = self[item]
        except KeyError:
            pass
        if isinstance(value, dict):
            value = YamlJsonAttr(value)
        return value


class YamlParser:
    """yaml解析器"""

    def __init__(self, path):
        # path规范化的绝对路径
        self.path = os.path.abspath(path)

    def get_yaml_data(self):
        """获取yaml数据"""
        with open(self.path, 'r', encoding='utf-8') as file:
            # cont返回文件中的所有内容，包括注释字符等。
            cont = file.read()

        try:
            # yaml_content返回python字典
            # 即：{'groupId': 1888, 'mid': 7120939}
            yaml_content = yaml.safe_load(cont)

            return YamlJsonAttr(yaml_content)
        except:
            msg = "yaml文件{}格式不正确".format(os.path.abspath(self.path))
            return msg


if __name__ == '__main__':
    path = r'E:\msshuo-test\data\single\test_apply_join.yaml'
    headers_data = YamlParser(path).get_yaml_data().tests.headers
    print(headers_data)
